package zj.xinxin.common.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ObjectParseUtils {

  /**
   * 获取属性名数组
   * @param o 待转换对象
   * @return 属性名数组
   */
  public static String[] getFiledName(Object o) {
    Field[] fields = o.getClass().getDeclaredFields();
    String[] fieldNames = new String[fields.length];
    for (int i = 0; i < fields.length; i++) {
      fieldNames[i] = fields[i].getName();
    }
    return fieldNames;
  }

  /**
   * 获取每个属性的描述信息
   * 其中每个属性的描述必须使用ApiModelProperty注解进行描述
   * @param obj 对象信息
   * @return Map<属性, 属性描述>
   */
  public static <T> Map<String, String> getFiledNameAndDescription(Class<T> obj){
    Field[] fields = obj.getDeclaredFields();
    Map<String, String> result = new HashMap<>();
    for (Field field:fields) {
      result.put(field.getName(), field.getAnnotation(ApiModelProperty.class).value());
    }
    return result;
  }

  /**
   * 获取每个属性的描述信息
   * 其中每个属性的描述必须使用ApiModelProperty注解进行描述
   * @param obj 对象信息
   * @return Array[属性描述]
   */
  public static <T> String[] getFiledDescription(Class<T> obj){
    Field[] fields = obj.getDeclaredFields();
    String[] fieldDes = new String[fields.length];
    for (int i = 0; i < fields.length; i++) {
      fieldDes[i] = fields[i].getAnnotation(ApiModelProperty.class).value();
    }
    return fieldDes;
  }


  /**
   * 根据属性名获取属性值
   * @param fieldName 属性名
   * @param o 对象
   * @return 属性值
   */
  public static Object getFieldValueByName(String fieldName, Object o) {
    try {
      String firstLetter = fieldName.substring(0, 1).toUpperCase();
      String getter = "get" + firstLetter + fieldName.substring(1);
      Method method = o.getClass().getMethod(getter);
      return method.invoke(o);
    } catch (Exception e) {
      log.error("获取属性值失败！" + e, e);
    }
    return null;
  }

  /**
   * 获取属性的数据类型
   * @param fieldName 属性名
   * @param o 对象
   * @return 属性类型
   */
  public static Object getFiledType(String fieldName, Object o) {
    Field[] fields = o.getClass().getDeclaredFields();
    for (Field field : fields) {
      if (Objects.equals(fieldName, field.getName())) {
        return field.getType();
      }
    }
    return null;
  }

}